package Gramatica;


//* Anderson Caco : de <programa> até <decls_final>
//* André (Dedé): de <typedef> até <funcao>
//* Carlos: de <chamada_funcao> até <tipo_primitivo>
//* Edney: de <struct> até <cmd>
//* Elisson: de <if> até <for>
//* Ivo:  de <printf> até <atribuicao>
//* Linton: de <incremento> até <igualdade>
//* Marcone:  de <relacional> até <op_adicao>
//* Matheus: de <multiplicacaot> até <unario_prefixa>
//* Nathalia: de <unario_posfixa> até <primarios>


/*------------------------------------------------------------------------------
Regras
------------------------------------------------------------------------------
<x>     -   nao terminais
 x      -   reservadas
"x"     -   terminais
|       -   opcao
::=     -   operador
(x|x|x) -   escolha multipla
[x]     -   opcional com repeticao zero ou uma vez
{x}     -   opcional com repeticao zero ou mais vezes
{x}+    -   com repeticao uma ou mais vezes
-------------------------------------------------------------------------------
                                GRAMATICA
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Blocos
-------------------------------------------------------------------------------
<programa> ::= <diretivas> <decls_inicial> void main "(" ")" <corpo_funcao> <decls_final>
<diretivas> ::= {include "<" identificador "." identificador ">"}

<decls_inicial> ::= {<typedef> | <const> | <prototipo> (";" | <corpo_funcao>) | <declaracao>}
<corpo_funcao> ::= "{" {<instrucao>} "}"
<decls_final> ::= {<funcao>}
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Declaracoes iniciais
<typedef> ::= typedef (<tipo_primitivo> | <struct>) identificador ";" 
<const> ::= const <tipo_primitivo> identificador "=" <expressao> ";"
<prototipo> ::= <tipo> identificador "(" [<args_declaracao>] ")"
<declaracao> ::= <declaracao_var> | <declaracao_struct>
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Funcao
-------------------------------------------------------------------------------
<funcao> ::= <prototipo> <corpo_funcao>
<chamada_funcao> := identificador "(" [<args_chamada>] ")"
<args_chamada> ::= <expressao> {, <expressao>}
<args_declaracao> ::= (<tipo_primitivo> | identificador) ["*"] identificador {"," (<tipo_primitivo> | identificador) ["*"] identificador } 
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Tipos
-------------------------------------------------------------------------------
<tipo> ::= <tipo_primitivo> |  identificador | void

<tipo_primitivo> ::= char | int | float | boolean

<struct> ::= struct "{" {<declaracao>}+ "}"

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Declaracoes
-------------------------------------------------------------------------------
<declaracao_var> ::= <tipo_primitivo> ( ["*"] identificador [<atribuicao_var>] | identificador <array> ){"," ( ["*"] identificador [<atribuicao_var>] | identificador <array> ) } ";"

<atribuicao_var> ::=  "=" <expressao>

<array> ::= "["  (  numeroInteiro "]" {"[" numeroInteiro "]"} [<atribuicao_array>]  
                   |  "]" <atribuicao_array> )
  
<atribuicao_array> ::=  "=" "{" [ <expressao> {"," <expressao>} ] "}"

<declaracao_struct> ::= identificador ( ["*"] identificador | identificador {"[" numeroInteiro "]"}+ ) 
                                 {"," ( ["*"] identificador | identificador {"[" numeroInteiro "]"}+ )  } ";"
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Comandos
-------------------------------------------------------------------------------
<cmd> ::= <if> | <while> | <do_while> | <return> | <for> | <printf> | <scanf>
<if> := if "("<expressao>")" <bloco> [else <bloco>]
<while> ::= while "(" <expressao> ")" <bloco>
<do_while> ::= do <bloco> while "("<expressao> ")" ";"
<return> ::= return <expressao>;
<for> ::= for "(" <atribuicao> ";" <expressao> ";" (<atribuicao> | <expressao> ) ")" <bloco>
<printf> ::= printf "(" charconst {"," <expressao>} ")" ";"
<scanf> ::= scanf "(" charconst {"," <expressao>}+ ")" ";"
<bloco> ::= <instrucao> | "{" {<instrucao>} "}"
<instrucao> ::= (<declaracao>|<cmd>|<atribuicao>|<incremento>|<chamada_funcao>)";"
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Expressoes
-------------------------------------------------------------------------------	
<atribuicao> ::= { <variavel> "=" }+ <expressao> 
<incremento> ::= identificador <op_incremento> | <op_incremento> identificador

<variavel> ::=  <elemento_var> | "*" identificador

<expressao>  ::= <logica_e> {|| <logica_e>}
<logica_e> ::= <igualdade> {&& <igualdade>}
<igualdade> ::= <relacional> {<op_igualdade> <relacional>}
<relacional> ::= <exp_aritmetica> {<op_relacional> <exp_aritmetica>} 
<op_igualdade> ::= "==" | "!="
<op_relacional> ::= "<" | "<=" | ">" | ">="

<exp_aritmetica> ::= <multiplicacao> {<op_adicao> <multiplicacao>}
<op_adicao> ::= "+" | "-"
<multiplicacao> ::= <cast> {<op_multiplicacao> <cast>}
<op_multiplicacao> ::= "*" | "/"
<cast> ::= <unario_prefixa> | "(" <tipo_primitivo> ")" <cast>
<op_incremento> ::= "++" | "--"
<op_unario> ::= "&" | "*"
<unario_prefixa> ::= <unario_posfixa> | <op_incremento> identificador | <op_unario> identificador
<unario_posfixa> ::= <elemento> |  identificador <elementos_gerais>
<elemento> :=  <primario> | "(" <expressao> ")"
<elementos_gerais> ::= <op_incremento> | <elemento_variavel> | <elemento_args>
<elemento_variavel> :: = { "[" <exp_aritmetica> "]" }  { <elemento_struct> }
<elemento_args> :: = "(" [<args_chamada>] ")"
<elemento_var> ::= identificador { "[" <exp_aritmetica> "]" }  { <elemento_struct> }
<elemento_struct> ::= "." identificador | "->" identificador
<primario> ::= numeroInteiro | numeroFlutuante | charconst
------------------------------------------------------------------------------
 */

